package com.deyuanyun.pic.wf.service;

import com.deyuanyun.pic.wf.domain.Node;
import com.deyuanyun.pic.wf.domain.ProcessDefinition;
import com.deyuanyun.pic.wf.domain.ProcessInstance;
import com.deyuanyun.pic.wf.domain.TaskInstance;

import java.util.List;
import java.util.Map;

/**
 * 维修工作流程的管理类，此Service为针对维修流程的功能，不针对具体表。
 *
 * @author ChenKui
 * @date 2016-06-16
 */
public interface RepairWorkflowService {


    /**
     * 保存或者修改流程（在update的情况下，目前不能用于删除节点的情况，实际也无此业务需求）
     *
     *  如果是create，则不需要传递任何ID值。
     *  如果是update，则都需要传递processDefinition的ID值和processInstance的ID值。
     *
     *      注意：在update的情况下，两个参数并没有关联关系，只是单纯根据ID字段是否有值来判断为update还是create。
     * @param processDefinition
     * @param processInstanceList
     */
    void createOrUpdate(ProcessDefinition processDefinition, List<ProcessInstance> processInstanceList);

    /**
     * 查询出所有维修流程
     *
     * @return
     */
    List<Map<String,Object>> queryProcessInstanceList();


    /**
     * 查询出所有默认内置的流程节点。用于新增“其它”流程的时候。
     * 目前是按照ID_字段来排序的，所以初始化数据的时候需要注意这个情况。
     *
     * @return
     */
    List<Node> queryNodeByNeed();

    /**
     * 根据nodeId获取Node，有sessionCache缓存。
     *      只是名称是sessionCache罢了，和session没什么关系的哈。
     * 
     * @param nodeId
     * @return
     */
    Node queryNode(String nodeId);
    
    
    /**
     * 为缺陷点创建维修流程、或者为缺陷点变更维修流程。
     * 
     * @param def_id 维修流程ID
     * @param defectInfoId 缺陷点ID
     */
    void createOrUpdateTaskInstance(String def_id,String defectInfoId);
    
    
    
    /**
     * 根据缺陷点ID，获取对应的维修流程信息。
     * 
     * @param defectInfoId
     * @return
     */
    List<TaskInstance> queryTaskInstance(String defectInfoId);
    
    /**
     * 根据流程定义编号，获取具体的流程节点信息
     * 
     * @param definitionId
     * @return
     */
    List<ProcessInstance> queryProcessInstance(String definitionId);
    
    /**
     * 根据名称查询流程定义，主要用于判断新增流程的时候 是否存在该流程名称。
     * 
     * @param name
     * @param id
     * @return
     */
    ProcessDefinition queryProcessDefinitionByNameNotId(String name,String id);
    
    /**
     * 根据主键查询，有缓存的。
     * 
     * @param definitionId
     * @return
     */
    ProcessDefinition queryProcessDefinitionById(String definitionId);
}
